package cn.zhuzicc.basic.jvm.t2;

import java.io.IOException;
import java.lang.ref.SoftReference;
import java.util.ArrayList;
import java.util.List;

/**
 * @author zhaoxiang
 * @version 1.0
 * @description 软引用示例
 * -Xmx20m -XX:+PrintGCDetails -verbose:gc
 * @Date 2021/9/20 16:54
 */
public class Demo2_3 {
    static final int _4M = 4 * 1024 * 1024;

    /**
     * 场景：加载网络图片，内存空间紧张时，强引用会抛出内存溢出的错误，
     * 不太重要的资源，在内存紧张时就先释放掉资源，把内存让出来。
     * 下次用到的时候在重新读取。
     *
     * @param args
     */
    public static void main(String[] args) throws IOException {
//        test();
        test2();
    }

    /**
     * 强引用
     */
    private static void test() throws IOException {
        List<byte[]> list = new ArrayList<>();
        for (int i = 0; i < 5; i++) {
            list.add(new byte[_4M]);
        }
        System.in.read();
    }

    /**
     * 软引用
     * list --> SoftReference (这是一个强引用)
     * SoftReference --> byte[](这是一个软引用)
     */
    private static void test2() throws IOException {
        List<SoftReference<byte[]>> list = new ArrayList<>();
        for (int i = 0; i < 5; i++) {
            SoftReference<byte[]> ref = new SoftReference<>(new byte[_4M]);
            System.out.println(ref.get());
            list.add(ref);
            System.out.println(list.size());
        }
        System.out.println("循环结束" + list.size());
        for (SoftReference<byte[]> ref : list) {
            System.out.println(ref.get());
        }
    }
}
